// 统一标记以下 s,p,o,e,m,E,c,b,f,d,r,mr,md,ks,rsp
// 不管是 ajax 请求，还是其他异步请求，都是上面统一的数据结构

export interface IAsyncState {
  s: number; // 第几次执行
  p: boolean; // pending 是否正在执行
  o: boolean; // ok 本次是否执行成功
  e: boolean; // error 本次是否执行失败
  E?: Error | any; // 异常对象
  u?: string; // uri 访问路径，不同的 asCallXXX 有自己的路径规划
  r?: any; // request 请求，如是是 asCallPromise 则为 null
  c?: number; // code 返回代码
  m?: string; // msg 返回描述字符串
  d?: any; // 最终有效的响应数据，抹平各服务端返回数据key不同的差异，如有返回 body,content,data 的差异。
  b?: Date; // 本次调用开始执行时间
  f?: Date; // 本次调用结束执行时间
  rsp?: any; // 保留原始的响应
  ss: React.Dispatch<React.SetStateAction<IAsyncState>>, // 修改自己的 setState
  re?: () => void, // 重新强制执行，可能因为服务端暂时故障，过会重试就好
  canel: () => void, // 取消当前的执行
}

export const initialAsyncState: IAsyncState = {
  s: 0,
  p: false,
  o: false,
  e: false,
  ss: v => v,
  canel: () => undefined,
};

export function createInitialAsyncState(): IAsyncState {
  return {
    s: 0,
    p: false,
    o: false,
    e: false,
    ss: v => v,
    re: () => {}, // 初始不支持重做，需要每次 execute 自己设置，确保重做总是针对最新一次 execute 一摸一样的
    canel: () => undefined,
  }
}
